<?php
class Prod_productos extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'Prod_producto');

    	$this->title = 'Productos :: Productos';
		$this->CARPETA_VISTAS = 'productos/';
		$this->nombre_entidad = 'Producto';
		$this->nombre_entidad_plural = $this->nombre_entidad . 's';

		$this->pagina_ver = $this->CARPETA_VISTAS . 'producto_ver_todos_view';
		$this->pagina_editar = $this->CARPETA_VISTAS . 'producto_edit_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'producto_filtros_ver_todos_view';
	}


	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$objEntidad = $this->getObjeto($idEntidad);
		$objEntidad->codigo = $this->input->post('txt_codigo');
		$objEntidad->nombre = $this->input->post('txt_nombre');
		$objEntidad->descripcion = $this->input->post('txt_descripcion');
		$objEntidad->existencia_minima = $this->input->post('txt_existencia_minima');
		$objEntidad->observacion = $this->input->post('txt_observacion');
		$objEntidad->costo = $this->input->post('txt_costo');
		$objEntidad->margen_ganancia = $this->input->post('txt_margen_ganancia');
		
		$dadoDeBaja = $this->input->post('chk_baja');
		$objEntidad->baja = $dadoDeBaja;
		if($dadoDeBaja) $objEntidad->observacion_baja = $this->input->post('txt_observacion_baja');
		else $objEntidad->observacion_baja = '';

		// Las tablas DIVISA y PAIS no pueden referenciarse por el momento.
		$id_procedencia = is_numeric($this->input->post('f_txt_pais_id')) ? $this->input->post('f_txt_pais_id') : NULL;
		$objEntidad->ubic_pais_id = $id_procedencia;

		$id_divisa = is_numeric($this->input->post('f_txt_moneda_id')) ? $this->input->post('f_txt_moneda_id') : NULL;
		$objEntidad->div_divisa_id = $id_divisa;
		
		$datos['objEntidad'] = $objEntidad;
		
		
		// OBJETOS RELACIONADOS
		$objetosRel = array();
		$id_marca = is_numeric($this->input->post('sel_marca')) ? $this->input->post('sel_marca') : NULL;
		$objetosRel[] = new Prod_marca($id_marca);

		$id_modelo = is_numeric($this->input->post('sel_modelo')) ? $this->input->post('sel_modelo') : NULL;
		$objetosRel[] = new Prod_modelo($id_modelo);

		$id_subrubro = is_numeric($this->input->post('sel_subrubro')) ? $this->input->post('sel_subrubro') : NULL;
		$objetosRel[] = new Prod_subrubro($id_subrubro);

		$id_unidad = is_numeric($this->input->post('f_txt_unidad_id')) ? $this->input->post('f_txt_unidad_id') : NULL;
		$objetosRel[] = new Prod_unidad($id_unidad);

		$id_tipo = is_numeric($this->input->post('sel_tipo')) ? $this->input->post('sel_tipo') : NULL;
		$objetosRel[] = new Prod_tipo($id_tipo);

		$datos['objRelacionados'] = $objetosRel;

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_marca = new Prod_marca();
		$obj_marca->order_by('nombre', 'asc');
		$dataView['listado_marcas'] = $obj_marca->get_iterated();

		$obj_modelo = new Prod_modelo();
		$obj_modelo->order_by('nombre', 'asc');
		$dataView['listado_modelos'] = $obj_modelo->get_iterated();

		$obj_rubro = new Prod_rubro();
		$obj_rubro->order_by('nombre', 'asc');
		$dataView['listado_rubros'] = $obj_rubro->get_iterated();

		$obj_subrubro = new Prod_subrubro();
		$obj_subrubro->order_by('nombre', 'asc');
		$dataView['listado_subrubros'] = $obj_subrubro->get_iterated();

		$obj_unidad = new Prod_unidad();
		$obj_unidad->where('activo', TRUE);
		$dataView['listado_unidades'] = $obj_unidad->get_iterated();

		$obj_procedencia = new Ubic_pais();
		$obj_procedencia->where('activo', TRUE);
		$dataView['listado_procedencias'] = $obj_procedencia->get_iterated();

		$obj_divisa = new Div_divisa();
		$obj_divisa->where('activo', TRUE);
		$dataView['listado_divisas'] = $obj_divisa->get_iterated();

		$obj_tipo = new Prod_tipo();
		$dataView['listado_tipos'] = $obj_tipo->get_iterated();

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$codigo = trim($this->input->post('f_txt_codigo'));
		if(!empty($codigo)) { 
			$objEntidad->like('codigo', $codigo); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Código => ' . $codigo;
		}

		$nombre = trim($this->input->post('f_txt_nombre'));
		if(!empty($nombre)) { 
			$objEntidad->like('nombre', $nombre); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Nombre => ' . $nombre;
		}

		$marca_id = $this->input->post('f_sel_marca');
		if($marca_id != 0) {
			$objEntidad->where('prod_marca_id', $marca_id); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Marca ';
		}

		$modelo_id = $this->input->post('f_sel_modelo');
		if($modelo_id != 0) {
			$objEntidad->where('prod_modelo_id', $modelo_id); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Modelo ';
		}

		$subrubro_id = $this->input->post('f_sel_subrubro');
		if($subrubro_id != 0) {
			$objEntidad->where('prod_subrubro_id', $subrubro_id); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Subrubro ';
		}

		$rubro_id = $this->input->post('f_sel_rubro');
		if($rubro_id != 0) {
			$objEntidad->where_related_prod_subrubro('prod_rubro_id', $rubro_id); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Rubro ';
		}

		$proveedor = trim($this->input->post('f_txt_proveedor'));
		if(!empty($proveedor)) { 
			$objEntidad->like_related('prod_proveedor_producto/persona', 'razon_social', $proveedor);
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Proveedor => ' . $proveedor;
		}

		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		$objEntidad = $this->getObjeto($id_elemento);

		// Valido si tiene elementos asociados.
		$objStock = new Prod_stock();
        $objStock->where('prod_producto_id', $id_elemento);

        $objMoto = new Prod_moto();
        $objMoto->where('prod_producto_id', $id_elemento);

        $objAdjunto = new Prod_adjunto();
        $objAdjunto->where('prod_producto_id', $id_elemento);

        if ($objStock->count() == 0 && 
        	$objMoto->count() == 0 &&
        	$objAdjunto->count() == 0) return TRUE;
        else return FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE o CREARSE NUEVO. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}

	/** Llamada desde AJAX para mostrar un resumen de un objeto. Se sobreescribe el método heredado
	para darle un comportamiento particular. */
	public function toString($id_elemento, $datos = '', $objEntidad = NULL)
	{
		if($objEntidad == NULL) $objEntidad = $this->getObjeto($id_elemento);
		
		$id_elemento = $objEntidad->id;

		$datos = '<h4>Detalle del producto</h4>';
		$datos .= $objEntidad->toString();
		$datos .= "<input type='hidden' id ='txt_prod_id' name ='txt_prod_id' value='$id_elemento'>";

		parent::toString($id_elemento, $datos);
	}

	/** Llamada desde AJAX para mostrar un resumen de un objeto. . Se sobreescribe el método heredado
	para darle un comportamiento particular. */
	public function cargarSegunFiltro($nombre, $codigo)
	{
		$objEntidad = $this->getObjeto();
		
		if($nombre != '-' || $codigo != 0) {
			if($codigo != 0) $objEntidad->where('codigo', $codigo);
			if($nombre != '-') $objEntidad->like('nombre', $nombre);

			$objEntidad->limit(1);
			$objEntidad->order_by('id', 'desc');
			$objEntidad->get();
			if ($objEntidad->exists() > 0) $this->toString($objEntidad->id, '', $objEntidad);
			else echo "<pre><p>No se encontraron coincidencias con lo ingresado</p></pre>";
		}
		else echo "<pre><p>Debe ingresar filtros de búsqueda antes de continuar</p></pre>";
	}

	public function generar_excel()
	{
		$dataView['datos_campos'] = array(array('field', 'codigo'),
											array('field', 'nombre'),
											array('field', 'descripcion'),
											array('field', 'existencia_minima'),
											array('field', 'costo'),
											array('relation', 'nombre', 'prod_marca'), 
											array('relation', 'nombre', 'prod_modelo'),
											array('relation', 'nombre', 'prod_subrubro'));
		$dataView['headers_datos'] = array('Código', 'Nombre', 'Descripción', 'Existencia mín.', 'Costo', 'Marca', 'Modelo', 'Sub-rubro');

		parent::generar_excel($dataView);
	}

	protected function setAyuda($dataView) {
		$dataView['ayuda_explicación_adicional'] = 'Además de la funcionalidad mencionada arriba, se puede realizar la gestión de adjuntos 
													(documentos, imágenes, archivos en general) relacionados con cada 
													elemento cargado, a través del botón ' . $this->extras_form->adjuntoButton('', 0, TRUE) .
													'</br>La visualización y gestión de los proveedores de un determinado producto, se podrá 
													realizar a través del botón ' . $this->extras_form->verProveedorButton(0, TRUE);
		$dataView['ayuda_borradoPosible'] = 'Sólo pueden borrarse productos que no estén siendo utilizados o referenciados en otras áreas del sistema.';
		$dataView['boton_visualizar'] = TRUE;

		return $dataView;
	}
}